home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d19 / zdoor33.arc / NOSCROLL.ASM < prev    next >
Assembly Source File  |  1989-03-12  |  26KB  |  586 lines

  1. page 77,132
  2.  
  3. CSeg           Segment  Para Public 'CODE'
  4.                Assume   CS:CSeg,DS:CSeg,ES:CSeg
  5.  
  6. ;┌────────────────────────────────────────────────────────────────────────────┐
  7. ;│  NoScroll.Asm                                                              │
  8. ;│                                                                            │
  9. ;│  A program to restrict the scrolling of output to the first 22 rows of     │
  10. ;│  the screen.                                                               │
  11. ;│                                                                            │
  12. ;│  by R. P. Byrne - 1/11/89                                                  │
  13. ;│                                                                            │
  14. ;│  Syntax:   NoScroll [n]                                                    │
  15. ;│                                                                            │
  16. ;│   where n represents the last row on the screen that will be allowed to    │
  17. ;│   scroll (if not specified, defaults to line 22)                           │
  18. ;│                                                                            │
  19. ;│  First call installs this utility, second call de-installs it              │
  20. ;│                                                                            │
  21. ;│                                                                            │
  22. ;│  Credit where due:  This program is based on concepts implemented by       │
  23. ;│                     Sam Smith for his Prons.Asm program.                   │
  24. ;└────────────────────────────────────────────────────────────────────────────┘
  25.  
  26.  
  27. ;============ *** PSP DATA LABELS *** ==========================================
  28.  
  29.                org     80h               ;INTERESTING PSP STUFF STARTS HERE
  30.  
  31. Parm_Length    db      ?                 ;LENGTH OF CMD LINE PARAMETERS
  32. Parameters     label   byte              ;THE COMMAND PARAMETERS ARE HERE
  33.  
  34. ;===============================================================================
  35.  
  36.                org      100h
  37.  
  38. Entry_Point:   jmp      EntryPt
  39.  
  40. ;┌─────────────────────────────────────────────────────────────────────────────┐
  41. ;│  Data Storage Area                                                          │
  42. ;└─────────────────────────────────────────────────────────────────────────────┘
  43.  
  44. MaxRow         db       21       ;(last scrollable row on screen) - 1
  45.                         
  46. ProgramID      db       'NoScroll by R. P. Byrne 1/11/89','$'
  47. PgmIDLen       equ      $-ProgramID
  48.  
  49. OldInt10       dd       ?        ;the "real" bios video isr
  50. OldInt21       dd       ?        ;the "real" dos function call isr
  51.  
  52. DummyReturn    dw       ?        ;just a dummy variable used for stack adjustment
  53.  
  54. ;┌─────────────────────────────────────────────────────────────────────────────┐
  55. ;│  Commonly called subroutines                                                │
  56. ;└─────────────────────────────────────────────────────────────────────────────┘
  57.  
  58. UseOldInt10    Proc  Near
  59.                push        bp       ;save bp just in case machine has old bios bug
  60.                pushf                ;push flags to simulate an int instruction
  61.                call dword ptr cs:OldInt10    ;call bios video service
  62.                pop         bp       ;restore base pointer
  63.                ret                  ;return to caller
  64. UseOldInt10    EndP
  65.  
  66. ;┌─────────────────────────────────────────────────────────────────────────────┐
  67. ;│  Interrupt service routine (ISR) for Bios Video interrupt                   │
  68. ;└─────────────────────────────────────────────────────────────────────────────┘
  69.  
  70. Entry10        Proc  far
  71.                assume ds:nothing, es:nothing, ss:nothing
  72.  
  73.                sti
  74.    Chk0E:      cmp         ah,0Eh        ;TTY write request?
  75.                jnz         Chk06         ;no, go check for scroll request
  76.                cmp         al,0Ah        ;yes.  is character a linefeed?
  77.                jnz         AllOther      ;nope ... no special treatment
  78.                call        ChkTTY        ;yup ... go take care of it
  79.                jmp short   AllDone
  80.  
  81.    Chk06:      cmp         ah,06h        ;scroll page request?
  82.                jnz         Chk02         ;no, go check for cursor move request
  83.                call        ChkScroll     ;yes, go take care of it
  84.                jmp short   AllDone
  85.  
  86.    Chk02:      cmp         ah,02h        ;set pos request?
  87.                jnz         AllOther      ;no ... no special treatment
  88.                cmp         dh,MaxRow     ;request outside of window?
  89.                jbe         AllOther      ;nope ...
  90.                call        ChkCursor     ;yup ... go fix it
  91.                jmp short   AllDone
  92.  
  93.    AllOther:   call        UseOldInt10   ;call the "real" int 10h for service
  94.  
  95.    AllDone:    IRet                      ;Return to requestor of video service
  96.  
  97. Entry10        EndP
  98.  
  99. ;──────[ Int 10h, function 0Eh - TTY write request ]──────────────────────────
  100.  
  101. ChkTTY         Proc  near
  102.  
  103.                push        ax
  104.                push        bx
  105.                push        cx
  106.                push        dx
  107.                push        si
  108.                push        di
  109.                push        ds
  110.                push        es
  111.                push        bp
  112.  
  113.                push        ax                   ;save ax
  114.                mov         ah,03h               ;call Bios to get the current
  115.                call        UseOldInt10          ;    cursor position into DX
  116.                pop         ax                   ;restore ax
  117.  
  118.    ChkNewRow:  inc         dh                   ;adjust row number for LF
  119.                cmp         dh,MaxRow            ;outside the window?
  120.                jg          ScrollIt             ;yes ... scroll the window
  121.                call        UseOldInt10          ;no, let "real" bios handle it
  122.                jmp         TTY_GoBack
  123.  
  124.    ScrollIt:   mov         ah,06h               ;video scroll up function
  125.                mov         al,1                 ;only scroll 1 line
  126.                xor         cx,cx                ;upper left corner = 0,0
  127.                mov         dh,MaxRow            ;
  128.                mov         dl,4Fh               ;lower right corner = MaxRow,79
  129.                mov         bh,07h               ;use white on black attribute
  130.                call        UseOldInt10          ;Call Int 10h
  131.  
  132.    MovCursor:  mov         bh,0                 ;video page 0
  133.                mov         ah,2                 ;set cursor function
  134.                mov         dh,MaxRow            ;1st col of last row
  135.                mov         dl,0                 ;  ie. MaxRow,0
  136.                call        UseOldInt10          ;move the cursor
  137.  
  138. TTY_GoBack:    pop         bp
  139.                pop         es
  140.                pop         ds
  141.                pop         di
  142.                pop         si
  143.                pop         dx
  144.                pop         cx
  145.                pop         bx
  146.                pop         ax
  147.  
  148.                ret
  149.  
  150. ChkTTY         EndP
  151.  
  152. ;──────[ Int 10h, function 6 - scroll page up request ]───────────────────────
  153.  
  154. ChkScroll      Proc  near
  155.  
  156.                cmp         ch,MaxRow      ;row of UL corner <= max?
  157.                jbe         ULisOK         ;yes, go check LR corner
  158.                mov         ch,MaxRow      ;no, adjust it
  159.    ULisOK:     cmp         dh,MaxRow      ;row of LR corner <= max?
  160.                jbe         LRisOK         ;yes, no adjustment needed
  161.                mov         dh,MaxRow      ;no, adjust it
  162.    LRisOK:     call        UseOldInt10    ;let old ISR do the scroll
  163.                ret
  164.  
  165. ChkScroll      EndP
  166.  
  167. ;──────[ Int 10h, function 2 - set cursor position request ]──────────────────
  168.  
  169. ChkCursor      Proc  near
  170.  
  171.                push        ax             ;Before we fix, scroll the screen by
  172.                push        bx             ;  (row requested - MaxRow) rows
  173.                push        cx             ;
  174.                push        dx             ;save cursor pos
  175.                mov         ah,06h         ;scroll page up function
  176.                mov         al,dh          ;calculate number of rows to scroll
  177.                sub         al,MaxRow      ;
  178.                xor         cx,cx          ;UL corner = 0,0
  179.                mov         dh,MaxRow      ;lower right corner = 21,79
  180.                mov         dl,4Fh         ;
  181.                mov         bh,07h         ;use white on black attribute
  182.                call        UseOldInt10    ;call int 10h
  183.                pop         dx             ;restore cursor pos in dx
  184.                pop         cx             ;
  185.                pop         bx             ;
  186.                pop         ax             ;
  187.                mov         dh,MaxRow      ;Plug row number
  188.  
  189.    CursorOk:   call        UseOldInt10    ;Let "real" bios move cursor
  190.                ret
  191.  
  192. ChkCursor      EndP
  193.  
  194. ;┌─────────────────────────────────────────────────────────────────────────────┐
  195. ;│  Interrupt service routine (ISR) for Dos function request interrupt         │
  196. ;└─────────────────────────────────────────────────────────────────────────────┘
  197.  
  198. Entry21        Proc  far
  199.                assume ds:nothing, es:nothing, ss:nothing
  200.  
  201.                sti
  202.  
  203.    Chk09D:     cmp         ah,9
  204.                jnz         Chk02D
  205.                call        ChkString
  206.                jmp short   AlldoneD
  207.  
  208.  
  209.    Chk02D:     cmp         ah,2          ;console output request?
  210.                jnz         Chk40D        ;no, go check for file/device write
  211.                cmp         dl,0Ah        ;yes.  is character a linefeed?
  212.                jnz         AllOtherD     ;nope ... no special treatment
  213.                call        ChkConOut     ;yup ... go take care of it
  214.                jmp short   AllDoneD
  215.  
  216.    Chk40D:     cmp         ah,40h        ;device output request?
  217.                jnz         AllOtherD     ;no ... no special treatment
  218.                cmp         bx,1          ;standard output device?
  219.                jne         ChkStdErr     ;no, see if std err
  220.                jcxz        AllOtherD     ;if char count 0, no special treatment
  221.                call        ChkWrite      ;yes, go watch for linefeeds ...
  222.                jmp short   AllDoneD      ;   and then exit
  223.    ChkStderr:  cmp         bx,2          ;standard error device?
  224.                jne         AllOtherD     ;no, no special treatment
  225.                call        Chkwrite      ;yup ... go handle the request
  226.                jmp short   AllDoneD
  227.  
  228.    AllOtherD:  jmp dword ptr cs:OldInt21     ;jump into dos
  229.  
  230.    AllDoneD:   Retf 2                    ;Return to requestor of service
  231.  
  232. Entry21        EndP
  233.  
  234. ;──────[ Int 21h, function 09h - write string to console ]────────────────────
  235.  
  236. ChkString      Proc     near
  237. ;
  238. ; Calling program has requested a write to either the standard output device or
  239. ; the standard error device
  240. ;
  241.                push        bx          ;preserve all registers that don't
  242.                push        cx          ;   return status information
  243.                push        dx          ;   for the call
  244.                push        si          ;
  245.                push        di          ;   CF acts as an error flag
  246.                push        ds          ;   AX returns number of bytes written
  247.                push        es          ;
  248.                push        bp          ;
  249.  
  250.                mov         si,dx       ;ds:si --> string to display
  251.    OneChar:    lodsb                   ;get a byte to display
  252.                cmp         al,'$'      ;end of string?
  253.                jz          NoMore      ;yes...time to quit
  254.                mov         dl,al       ;load dl for dos call
  255.                mov         ah,02h      ;dos console output function
  256.                int         21h         ;display one character
  257.                jmp short   OneChar     ;repeat for all characters in buffer
  258.  
  259.    NoMore:     pop         bp
  260.                pop         es
  261.                pop         ds
  262.                pop         di
  263.                pop         si
  264.                pop         dx
  265.                pop         cx
  266.                pop         bx
  267.  
  268.                clc                     ;clear CF for return
  269.  
  270.                ret
  271.  
  272. ChkString      EndP
  273.  
  274. ;──────[ Int 21h, function 40h - write to file/device ]───────────────────────
  275.  
  276. ChkWrite       Proc     near
  277. ;
  278. ; Calling program has requested a write to either the standard output device or
  279. ; the standard error device
  280. ;
  281.                push        bx          ;preserve all registers that don't
  282.                push        cx          ;   return status information
  283.                push        dx          ;   for the call
  284.                push        si          ;
  285.                push        di          ;   CF acts as an error flag
  286.                push        ds          ;   AX returns number of bytes written
  287.                push        es          ;
  288.                push        bp          ;
  289.  
  290.                mov         si,dx       ;ds:si --> string to display
  291.    DisplayOne: lodsb                   ;get a byte to display
  292.                mov         dl,al       ;
  293.                mov         ah,02h      ;dos console output function
  294.                int         21h         ;display one character
  295.                loop        DisplayOne  ;repeat for all characters in buffer
  296.  
  297.                pop         bp
  298.                pop         es
  299.                pop         ds
  300.                pop         di
  301.                pop         si
  302.                pop         dx
  303.                pop         cx
  304.                pop         bx
  305.  
  306.                clc                     ;clear CF for return
  307.                mov         ax,cx       ;set byte count for return
  308.  
  309.                ret
  310.  
  311. ChkWrite       EndP
  312.  
  313. ;──────[ Int 21h, function 02h - write to console ]───────────────────────────
  314.  
  315. ChkConOut      Proc     near
  316.  
  317.                ; calling program has requested a linefeed be sent to either
  318.                ; the standard output or standard error device.  Use int 10h
  319.                ; to satisfy the request while checking for scroll out of
  320.                ; window
  321.                push        ax
  322.                push        bx
  323.                push        cx
  324.                push        dx
  325.                push        si
  326.                push        di
  327.                push        ds
  328.                push        es
  329.                push        bp
  330.  
  331.                mov         ax,0E0Ah
  332.                int         10h
  333.  
  334.                pop         bp
  335.                pop         es
  336.                pop         ds
  337.                pop         di
  338.                pop         si
  339.                pop         dx
  340.                pop         cx
  341.                pop         bx
  342.                pop         ax
  343.  
  344.                clc                  ;clear carry for return
  345.  
  346.                ret
  347.  
  348. ChkConOut      EndP
  349.  
  350. ;┌─────────────────────────────────────────────────────────────────────────────┐
  351. ;│  Program installation section                                               │
  352. ;└─────────────────────────────────────────────────────────────────────────────┘
  353.  
  354. EntryPt:       assume cs:CSeg, ds:CSeg, es:CSeg, ss:CSeg
  355.  
  356.                mov      ah,35h         ;function 35h retrieves interrupt vector
  357.                mov      al,10h         ;we're interested in interrupt 10h
  358.                int      21h            ;get int 10 vector into es:bx
  359.  
  360.                mov      di,offset ProgramID  ;es:di --> program id area of
  361.                mov      si,di                ; current int 10h isr, ds:si -->
  362.                mov      cx,PgmIDLen          ; pgm id area of this pgm.
  363.           repe cmpsb                         ;check for matching pgm id's
  364.                je       Uninstall      ;program ID string found in int 10 ISR
  365.                jmp      FirstTime      ;go install this program
  366.  
  367. Uninstall:     ;on entry, es contains seg. of isr to be removed (put there
  368.                ;by call to dos function 35h)
  369.  
  370.                push     ds             ;save our data seg for final message
  371.                lds      dx,es:OldInt10 ;load addr of original isr into ds:dx
  372.                mov      ah,25h         ;set interrupt vector
  373.                mov      al,10h         ;reset int 10h isr back to where it was ...
  374.                int      21h            ;  before user installed NoScroll
  375.                                        ;
  376.                lds      dx,es:OldInt21 ;load addr of original isr into ds:dx
  377.                mov      ah,25h         ;set interrupt vector
  378.                mov      al,21h         ;reset int 21h isr back to where it was ...
  379.                int      21h            ;  before user installed NoScroll
  380.                                        ;
  381.                push     es             ;save seg of isr
  382.                mov      ax,es          ;transfer isr's code segment addr ...
  383.                mov      ds,ax          ;  to the data seg reg
  384.                mov      si,2Ch         ;ds:si --> segment addr of isr's environment
  385.                lodsw                   ;get env seg of tsr process ...
  386.                mov      es,ax          ;  load into es for dos call ...
  387.                mov      ah,49h         ;  and deallocate it
  388.                int      21h            ;
  389.                pop      es             ;restore code seg of isr ...
  390.                mov      ah,49h         ;  and deallocate it
  391.                int      21h            ;  
  392.                pop      ds             ;restore our data segment register
  393.  
  394.                mov      ah,9
  395.                mov      dx,offset ProgramId
  396.                int      21h            ;start explaining
  397.                mov      ah,9
  398.                mov      dx,offset RemovMsg
  399.                int      21h            ;explain
  400.  
  401.                int      20h            ;we're done ... exit to dos
  402.  
  403. FirstTime:     assume es:nothing
  404.  
  405.                xor      ch,ch
  406.                mov      cl,Parm_Length ;length of command line parameters
  407.                mov      si,offset Parameters
  408.                jcxz     Defaults       ;if no parameters, then use default maxrow
  409.  
  410.    Strip_L:    lodsb
  411.                cmp       al,' '        ;skip all leading spaces ...
  412.                jz        IgnoreCh
  413.                cmp       al,09         ; ... and tab characters
  414.                jz        IgnoreCh
  415.                jmp short GetParm
  416.    IgnoreCh:   dec       cx
  417.                jmp short Strip_L
  418.  
  419.    GetParm:    jcxz     Defaults       ;nothing there but white space
  420.                dec      si             ;ds:si ---> 1st non-blank char in cmd line
  421.                                        ;   cx = length of command line
  422.                call     Ascii_To_Bin   ;should return a valid binary number in bx
  423.                jnc      ChkRange       ;CF --> non-numeric data
  424.                jmp      Syntax         ;   Show Syntax msg and exit w/out install
  425.  
  426.    ChkRange:   cmp      bx,25          ;check row num. for valid range
  427.                jg       BadRow         ;if invalid, show error msg and exit w/out install
  428.                cmp      bx,1
  429.                jl       BadRow
  430.  
  431.                dec      bx             ;Ok, valid rownum entered ... adjust to zero
  432.                mov      MaxRow,bl      ;   relative coordinate and store for use
  433.  
  434.    Defaults:   mov      ah,35h         ;Get vector
  435.                mov      al,10h         ;   for int 10h
  436.                int      21h
  437.                mov word ptr [OldInt10],bx       ;and store in memory for later
  438.                mov word ptr [OldInt10+2],es  ;store in OldInt10
  439.  
  440.                mov      ah,25h         ;set new vector for ...
  441.                mov      al,10h         ;   int 10h to use the routine at Entry10
  442.                mov      dx,offset Entry10    ;ds:dx ---> new int 10 isr
  443.                int      21h
  444.  
  445.                mov      ah,35h         ;Get vector
  446.                mov      al,21h         ;   for int 21h
  447.                int      21h
  448.                mov word ptr [OldInt21],bx       ;and store in memory for later
  449.                mov word ptr [OldInt21+2],es  ;store in OldInt10
  450.  
  451.                mov      ah,25h         ;set new vector for ...
  452.                mov      al,21h         ;   int 21h to use the routine at Entry10
  453.                mov      dx,offset Entry21    ;ds:dx ---> new int 21 isr
  454.                int      21h
  455.  
  456.                mov      ah,3           ;get cursor position
  457.                mov      bh,0
  458.                int      10h
  459.                cmp      dh,MaxRow
  460.                jb       ShowMsg
  461.  
  462.                mov      ah,6           ;scroll up
  463.                mov      al,1
  464.                mov      cx,0           ;UL corner is 0,0
  465.                mov      dh,MaxRow      ;LR corner is
  466.                mov      dl,4Fh         ;   MaxRow,79
  467.                int      10h
  468.  
  469.                mov      ah,2           ;set cursor position
  470.                mov      dh,MaxRow
  471.                mov      dl,0
  472.                int      10h
  473.  
  474. ShowMsg:       mov      ah,9
  475.                mov      dx,offset ProgramId
  476.                int      21h                  ;start explaining
  477.                mov      ah,9
  478.                mov      dx,offset InstMsg    ;explain
  479.                int      21h
  480.  
  481.                mov      dx,offset EntryPt    ;last resident byte
  482.                int      27h                  ;go memory resident
  483.  
  484. BadRow:        mov      dx,offset ProgramId
  485.                mov      ah,9
  486.                int      21h
  487.                mov      dx,offset BadRowMsg
  488.                mov      ah,9
  489.                int      21h
  490.                int      20h
  491.  
  492. Syntax:        mov      dx,offset ProgramId
  493.                mov      ah,9
  494.                int      21h
  495.                mov      dx,offset SyntaxMsg
  496.                mov      ah,9
  497.                int      21h
  498.                int      20h
  499.  
  500. ;┌─────────────────────────────────────────────────────────────────────────────┐
  501. ;│  Proc to convert ascii to binary for command line parsing                   │
  502. ;└─────────────────────────────────────────────────────────────────────────────┘
  503.  
  504. Ascii_To_Bin   Proc  near
  505. ;
  506. ; This procedure will convert a string of numbers in ASCII form to a
  507. ; binary number.  Upon entry, SI points at the string and CX contains
  508. ; the length of that string.
  509. ; The resulting binary number is returned to the calling procedure via
  510. ; the BX register.
  511. ; Validation of the string is performed by this procedure.  If an error
  512. ; is encountered (eg. an ASCII code representing a non-numeric character),
  513. ; the procedure will exit with the carry flag set.  It is the
  514. ; responsibility of the calling procedure to issue error messages to
  515. ; the user.
  516. ; Strings are converted as follows:
  517. ;    As each character in the string is fetched, it is converted to a
  518. ;    binary number.  The partial sum (kept in BX) is multiplied by 10.
  519. ;    the fetched and converted digit is added to the partial sum.
  520. ;
  521.               PUSH    AX
  522.               PUSH    CX
  523.               PUSH    SI
  524.  
  525.               CMP     CX,0              ;BE SURE THERE IS DATA TO PROCESS
  526.               JE      A2B_ERROR         ;IF NO DATA, EXIT WITH ERROR
  527.               XOR     BX,BX             ;INITIALIZE BX REGISTER TO ZERO
  528.  
  529. A2B_LOOP:     XOR     AX,AX             ;INIT AX TO ZERO
  530.               LODSB                     ;GET 1 CHARACTER FROM THE STRING
  531.               CMP     AL,30H            ;LOWER LIMIT FOR NUM. CHAR.
  532.               JB      A2B_ERROR
  533.               CMP     AL,39H            ;UPPER LIMIT FOR NUM. CHAR.
  534.               JA      A2B_ERROR
  535.               SUB     AL,30H            ;CONVERT 1 DIGIT TO BINARY
  536.               XCHG    AX,BX             ;SWITCH REGISTERS
  537.               PUSH    CX                ;SAVE CHARS REMAINING
  538.               MOV     CX,10             ;PARTIAL SUM MULTIPLIER
  539.               MUL     CX                ;MULTIPLY PARTIAL SUM BY 10
  540.               POP     CX                ;RESTORE CHARS REMAINING
  541.               JC      A2B_ERROR         ;CHECK FOR CARRY OUT OF AX
  542.               ADD     BX,AX             ;ADD PARTIAL SUM TO THE LAST DIGIT
  543.               JC      A2B_ERROR         ;CHECK FOR CARRY OUT OF BX
  544.               LOOP    A2B_LOOP          ;LOOP FOR ALL CHARS IN STRING
  545.  
  546. A2B_END:      CLC                       ;CLEAR CARRY FLAG --> NO ERRORS
  547.               JMP     A2B_EXIT          ;AND EXIT
  548.  
  549. A2B_ERROR:    STC                       ;SET CARRY FLAG --> ERROR FOUND
  550.  
  551. A2B_EXIT:     POP     SI
  552.               POP     CX
  553.               POP     AX
  554.               RET
  555.  
  556. ASCII_TO_BIN  ENDP
  557.  
  558.  
  559. ;┌─────────────────────────────────────────────────────────────────────────────┐
  560. ;│  Additional, non-resident storage                                           │
  561. ;└─────────────────────────────────────────────────────────────────────────────┘
  562.  
  563. InstMsg        db       ' installed.',0Dh,0Ah,'$'
  564. RemovMsg       db       ' removed.',0Dh,0Ah,'$'
  565.  
  566. BadRowMsg      db       0Dh,0Ah
  567.                db       'Row number out of range!  Min=1, Max=25.'
  568.                db       0Dh,0Ah,'$'
  569.  
  570. SyntaxMsg      db       0Dh,0Ah
  571.                db       'Usage: NoScroll [rownum]',0Dh,0Ah,0Dh,0Ah
  572.                db       'Where rownum specifies the number of the last unprotected row.'
  573.                db       0Dh,0Ah
  574.                db       '                    1 <= rownum <= 25'
  575.                db       0Dh,0Ah
  576.                db       '     If rownum is not specified, it will default to 22.'
  577.                db       0Dh,0Ah,'$'
  578.  
  579. ;┌─────────────────────────────────────────────────────────────────────────────┐
  580. ;│  That's all folks!                                                          │
  581. ;└─────────────────────────────────────────────────────────────────────────────┘
  582.  
  583. CSeg           EndS
  584.                end      Entry_Point
  585.  
  586.